//
// Created by tanzx on 01/03/0003.
//

#ifndef CPP_STUDY_TEST_DESTRUCTOR_H
#define CPP_STUDY_TEST_DESTRUCTOR_H
#include <iostream>

/**
 * 包含关系（当对象1中的private里有对象2时，当对象1析构后，对象2会自动析构）
 */
class Dog {
public:
    Dog() {
        std::cout << "Dog的构造函数" << std::endl;
    }
    ~Dog() {
        std::cout << "删除Dog对象 " << std::endl;
    }
};

class Person
{
public:
    Person() {
        std::cout << "Person的构造函数" << std::endl;
    }
    ~Person() {
        std::cout << "删除Person对象 " << std::endl;
    }
private:
    Dog dog;
};
class Student :public Person {
public:
    Student() {
        no = 1;
        std::cout << "Student的构造函数" << std::endl;
    }
    ~Student() {
        std::cout << "删除Student对象 " << std::endl;
    }
private:
    int no;
};

/**
 * 生命周期结束（在栈区创建的对象，生命周期结束时，会自动执行析构函数）
 */
void test_destructor_in_function();

/**
 * delete（用new创建的对象，函数返回时，不会自动执行析构函数，需要手动delete才能执行析构函数）（此处要注意，如果不主动delete容易造成内存泄露）
 * 对于new的对象，是指针，其分配空间是在堆上，故而需要用户删除申请空间，否则就是在程序结束时执行析构函数
 */
void test_destructor_in_delete();

/**
 * 继承关系（栈区子对象生命周期结束时，会先执行自身析构函数，再执行父对象的析构函数）
 */
void test_destructor_on_extends();

#endif //CPP_STUDY_TEST_DESTRUCTOR_H
